package cn.itcast.health.provider.service.impl;

import cn.itcast.health.interfaces.service.UserService;
import cn.itcast.health.mapper.UserMapper;
import cn.itcast.health.pojo.Menu;
import cn.itcast.health.pojo.Permission;
import cn.itcast.health.pojo.Role;
import cn.itcast.health.pojo.User;
import org.apache.dubbo.config.annotation.Service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import java.util.*;

/*
 * 修改人:衡培文
 * 添加权限业务层
 * */
@Service
@Transactional
public class UserServiceImpl implements UserService {
    @Autowired
    private UserMapper userMapper;
    @Override
    public User findUserByUserName(String username) {
        //根据用户名查询数据库中该用户的完整信息
        User user =   userMapper.findUserByUserName(username);
        //根据查询到的用户id查询到用户所属的角色 用户与角色之间属于一对多关系,返回值用set集合表示唯一
        Set<Role> userRoles = userMapper.findRolesByUid(user.getId());
        //判断查询出的角色是否为空
        if(userRoles!=null&&userRoles.size()!=0){
            for (Role role : userRoles) {//不为空就遍历这个这个角色集合,查询出每个角色所代表的权限
                // 角色和权限之间是多对多的关系,一个角色有多个权限,同样一个权限可能多个角色都拥有
                //通过角色和权限的中间表查询一个角色对应权限
                Set<Permission>  permissionsByRoleIds= userMapper.findPermissionsByRoleId(role.getId());
                //将查询出的权限封装到角色实体类中
                role.setPermissions(permissionsByRoleIds);
                }
            }
        //将查询到的角色封装到user实体类中
        user.setRoles(userRoles);
        return user;
        }

    @Override
    public List findMenu(String username) {
        //根据用户名查询数据库中该用户的完整信息
        User user = userMapper.findUserByUserName(username);
        //根据查询到的用户id查询到用户所属的角色 用户与角色之间属于多对多关系,返回值用set集合表示唯一
        Set<Role> userRoles = userMapper.findRolesByUid(user.getId());
        List<Menu> menuList = new ArrayList<>();
        //判断查询出的角色是否为空
        if(userRoles!=null&&userRoles.size()!=0){
            for (Role role : userRoles) {//不为空就遍历这个这个角色集合,查询出每个角色所代表的权限
               //角色表和菜单表也是多对多的关系,查询中间表, 返回菜单表id一个list集合
                List list = userMapper.findMenuByRoleId(role.getId());
                if (list!=null){
                    for (Object menu_id : list) {
                        Menu menu =userMapper.findMenuByMenuIdAndLevel(menu_id);
                        if (menu!=null){
                            //根据菜单表的内关联查询对应的子菜单
                            List<Menu> child  = userMapper.findMenuChildByMenuId(menu.getId());
                           //将child封装到menu返回
                            menu.setChildren(child);
                            //将menu放到menuList集合返回前端
                            menuList.add(menu);
                        }
                    }
                }
                }
        }
        System.out.println(menuList);
        return menuList;
    }
}